針對上述的問題,前兩點可以透過下方的實踐來避免:
pipx
來安裝系統會使用到的套件,原因是要避免影響到系統相依的套件進而導致系統故障,因此使用者需注意「請ㄧ定要使用虛擬環境」、「請不要將套件安裝至全域」。sudo pip intall
:在使用 pip install
不要使用 sudo
一方面是因為如上一點所述,不應該將套件安裝至全域。另一方面,這樣將出現讓惡意軟體有權限以 root 身份執行 setup.py 的機會,進而獲得使用者資訊或進行其他有安全疑慮的行為,事實上 PyPI 上過去也有許多命名假以亂真的套件(例如此 issue),若不小心安裝到可能會洩漏個人資訊。python3.X -m pip
而不是 pip install
:為避免當使用者擁有多版 Python 版本時,使用自己不明確的 pip 版本,最好的做法會是習慣使用特定版本的直譯器呼叫該版本的 pip 進行安裝,以免搞亂自己的安裝環境。即便可以搭配上一篇的 pyenv
使用 pip
,但我想透過 python3.X -m pip
使用 pip 雖然字數較多,但卻還是一個表達比較明確的指令,以避免歧義。requirements.txt
中,需要完全定義好每一個相依版本的版本號,只使用 ==
確認每一個相依套件版本,若使用 >=
、<=
等規則決定要安裝的相依套件,則可能導致安裝到相依套件彼此衝突的版本,因此在要釋出開發時所需的相依套件時,請務必只使用 ==
確定每一個套件的版本號。pip's new resolver:在今年 (2020) Mozilla 和 Chan Zuckerberg Initiative的幫助下將推動 pip 的 dependency resolver 發展,pip 在 20.x 版本之中將可以使用 resolver 來解決相依套件之間的版本衝突問題,這將加強 pip 在安裝相依套件時維持套件之間的一致性,舉例來說,過去 pip install "six<1.12" "virtualenv==20.0.2"
將會下載到 six==1.11
然而 virtualenv==20.0.2
需要的是 six>=1.12.0,<2
(參閱此連結),而在新版本推出後,將會顯示錯誤資訊拒絕安裝。
pip 的替代方案:同樣為了解決上方所述的問題,也發展出了許多可使用的替代套件管理工具,如此連結,例如 pipx 在安裝套件時自動開啟一個獨立的虛擬環境放置該套件並且讓使用者不用 activate 也能夠使用該指令, pipenv 提供了專案專用的虛擬環境、明確的套件相依樹並透過 Pipfile
和 Pipfile.lock
來明確定出使用的相依套件, poetry 相似於 pipenv 然而提供了較快的 lock 時間並且多了套件發佈的指令可以使用。
接下來將會介紹這些工具用於解決什麼樣的問題及他們的使用方式。
python -m pip